﻿using Microsoft.VisualStudio.TestTools.UnitTesting;
using Negocio = PSE.Tools.CadastroMensagens.Negocio;
using Entidades = PSE.Tools.CadastroMensagens.Entidades;
using PSE.Tools.Util.Entidades;
using System;
using System.Linq;
using System.Text;

namespace CadastroMensagensTest
{
    [TestClass()]
    public class MensagemTest
    {
        #region [ Inserir ]
        [TestMethod]
        public void InsereMensagemComEntidadeNula()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                negocio.Inserir(null);
            }
            catch (System.ArgumentNullException)
            {
                ok = true;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void InsereMensagemComIdiomamNulo()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                Entidades.Mensagem Mensagem = new Entidades.Mensagem();
                Mensagem.Idioma = null;
                Mensagem.Proposito = "xpto";
                Mensagem.TextoMensagem = "xpto";
                negocio.Inserir(Mensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("Idioma", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void InsereMensagemComTextoMensagemVazio()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                Entidades.Mensagem Mensagem = new Entidades.Mensagem();
                Mensagem.Idioma = new Negocio.Idiomas().ObterPorSigla("pt-br");
                Mensagem.Proposito = "xpto";
                Mensagem.TextoMensagem = "";
                negocio.Inserir(Mensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("TextoMensagem", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void InsereMensagemComTextoMensagemComMaisDe2000Caracteres()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                Entidades.Mensagem Mensagem = new Entidades.Mensagem();
                Mensagem.Idioma = new Negocio.Idiomas().ObterPorSigla("pt-br");
                Mensagem.Proposito = "xpto";
                Mensagem.TextoMensagem = StringUtil.RetornaTextoAleatorio(2001);
                negocio.Inserir(Mensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("TextoMensagem", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void InsereMensagemComPropositoComMaisDe2000Caracteres()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                Entidades.Mensagem Mensagem = new Entidades.Mensagem();
                Mensagem.Idioma = new Negocio.Idiomas().ObterPorSigla("pt-br");
                Mensagem.TextoMensagem = "xpto";
                Mensagem.Proposito = StringUtil.RetornaTextoAleatorio(2001);
                negocio.Inserir(Mensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("Proposito", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void InsereMensagemComTextoMensagemJaCadastrado()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            var entidadeJaExistente = negocio.Selecionar()[0];
            Entidades.Mensagem entidadeNova = new Entidades.Mensagem
            {
                Idioma = entidadeJaExistente.Idioma,
                TextoMensagem = entidadeJaExistente.TextoMensagem,
                Proposito = entidadeJaExistente.Proposito
            };
            try
            {
                negocio.Inserir(entidadeNova);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("TextoMensagem");
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void InsereMensagemComSucesso()
        {
            bool ok = true;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            string texto = StringUtil.RetornaTextoAleatorio(2000);
            string proposito = StringUtil.RetornaTextoAleatorio(2000);
            Entidades.Mensagem entidadeNova = new Entidades.Mensagem
            {
                Idioma = new Negocio.Idiomas().ObterPorSigla("pt-br"),
                TextoMensagem = texto,
                Proposito = proposito
            };
            try
            {
                negocio.Inserir(entidadeNova);
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }
        #endregion [ Inserir ]

        #region [ Atualizar ]
        [TestMethod]
        public void AtualizaMensagemComEntidadeNula()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                negocio.Atualizar(null);
            }
            catch (System.ArgumentNullException)
            {
                ok = true;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void AtualizaMensagemComTextoMensagemVazio()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                Entidades.Mensagem Mensagem = negocio.Selecionar()[0];
                Mensagem.TextoMensagem = "";
                negocio.Atualizar(Mensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("TextoMensagem", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void AtualizaMensagemComTextoMensagemComMaisDe2000Caracteres()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                Entidades.Mensagem Mensagem = negocio.Selecionar()[0];
                Mensagem.TextoMensagem = StringUtil.RetornaTextoAleatorio(2001);
                negocio.Atualizar(Mensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("TextoMensagem", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void AtualizaMensagemComPropositoComMaisDe2000Caracteres()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                Entidades.Mensagem Mensagem = negocio.Selecionar()[0];
                Mensagem.Proposito = StringUtil.RetornaTextoAleatorio(2001);
                negocio.Atualizar(Mensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("Proposito", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void AtualizaMensagemComIdiomaNulo()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                Entidades.Mensagem Mensagem = negocio.Selecionar()[0];
                Mensagem.Idioma = null;
                negocio.Atualizar(Mensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("Idioma", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void AtualizaMensagemComTextoMensagemJaCadastrado()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            Entidades.Mensagem Mensagem1 = negocio.Selecionar()[0];
            Entidades.Mensagem Mensagem2 = negocio.Selecionar()[1];
            Mensagem2.TextoMensagem = Mensagem1.TextoMensagem;
            try
            {
                negocio.Atualizar(Mensagem2);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("TextoMensagem");
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void AtualizaMensagemComSucesso()
        {
            bool ok = true;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            Entidades.Mensagem Mensagem = negocio.Selecionar()[0];
            try
            {
                negocio.Atualizar(Mensagem);
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }
        #endregion [ Atualizar ]

        #region [ Excluir ]
        [TestMethod]
        public void ExcluirMensagemNulo()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                negocio.Excluir(null);
            }
            catch (ArgumentNullException)
            {
                ok = true;
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void ExcluirMensagemComSucesso()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            Entidades.Mensagem entidadeNova = new Entidades.Mensagem
            {
                Idioma = new Negocio.Idiomas().ObterPorSigla("pt-br"),
                Proposito = StringUtil.RetornaTextoAleatorio(2000),
                TextoMensagem = StringUtil.RetornaTextoAleatorio(2000)
            };
            try
            {
                negocio.Inserir(entidadeNova);
                var entidade = negocio.ObterPorIdEIdioma(entidadeNova.Id, "pt-br");
                negocio.Excluir(entidade);
                entidade = negocio.ObterPorIdEIdioma(entidadeNova.Id, "pt-br");
                ok = (entidade == null);
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }
        #endregion [ Excluir ]

        #region [ Obter ]
        [TestMethod]
        public void ObterMensagemComIdVazio()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                var entidade = negocio.ObterPorId(0);
            }
            catch (ArgumentException)
            {
                ok = true;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void ObterMensagemComIdiomaVazio()
        {
            bool ok = false;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            try
            {
                var entidade = negocio.ObterPorIdEIdioma(1, "");
            }
            catch (ArgumentNullException)
            {
                ok = true;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void ObterMensagemPorIdComSucesso()
        {
            bool ok = true;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            string texto = StringUtil.RetornaTextoAleatorio(2000);
            string proposito = StringUtil.RetornaTextoAleatorio(2000);
            Entidades.Mensagem entidadeNova = new Entidades.Mensagem
            {
                Idioma = new Negocio.Idiomas().ObterPorSigla("pt-br"),
                TextoMensagem = texto,
                Proposito = proposito
            };
            try
            {
                negocio.Inserir(entidadeNova);
                var entidade = negocio.ObterPorId(entidadeNova.Id);
                ok = entidade.Count > 0;
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void ObterMensagemPorIdEIdiomaComSucesso()
        {
            bool ok = true;
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            string texto = StringUtil.RetornaTextoAleatorio(2000);
            string proposito = StringUtil.RetornaTextoAleatorio(2000);
            Entidades.Mensagem entidadeNova = new Entidades.Mensagem
            {
                Idioma = new Negocio.Idiomas().ObterPorSigla("pt-br"),
                TextoMensagem = texto,
                Proposito = proposito
            };
            try
            {
                negocio.Inserir(entidadeNova);
                var entidade = negocio.ObterPorIdEIdioma(entidadeNova.Id, "pt-br");
                ok = entidade != null;
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }

        #endregion [ Obter ]

        #region [ Listar ]
        [TestMethod]
        public void ListaMensagensComIdiomaVazio()
        {
            bool ok = false;
            try
            {
                Negocio.Mensagens mensagens = new Negocio.Mensagens();
                var entidade = mensagens.ListaMensagensPorIdioma("");
            }
            catch (ArgumentNullException)
            {
                ok = true;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void ListaMensagensComIdiomaComSucesso()
        {
            bool ok = false;
            try
            {
                var negocio = new Negocio.Mensagens();
                var idiomas = new Negocio.Idiomas();

                string sigla = StringUtil.RetornaTextoAleatorio(5);

                Entidades.Idioma idioma = new Entidades.Idioma { Sigla = sigla, Descricao = StringUtil.RetornaTextoAleatorio(10) };
                idiomas.Inserir(idioma);

                Entidades.Mensagem mensagem1 = new Entidades.Mensagem
                {
                    Idioma = idioma,
                    TextoMensagem = StringUtil.RetornaTextoAleatorio(2000),
                    Proposito = StringUtil.RetornaTextoAleatorio(2000)
                };

                Entidades.Mensagem mensagem2 = new Entidades.Mensagem
                {
                    Idioma = idioma,
                    TextoMensagem = StringUtil.RetornaTextoAleatorio(2000),
                    Proposito = StringUtil.RetornaTextoAleatorio(2000)
                };
                negocio.Inserir(mensagem1);
                negocio.Inserir(mensagem2);

                var mensagens = negocio.ListaMensagensPorIdioma(sigla);
                ok = (mensagens.Count == 2);

            }
            catch (ArgumentNullException)
            {
                ok = true;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void ListaMensagensIdiomaNaoCadastradoSiglaVazia()
        {
            bool ok = false;
            try
            {
                Negocio.Mensagens mensagens = new Negocio.Mensagens();
                var entidade = mensagens.ListaMensagensIdiomaNaoCadastrado("");
            }
            catch (ArgumentNullException)
            {
                ok = true;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void ListaMensagensIdiomaNaoCadastradoListagemComSucesso()
        {
            bool ok = false;
            try
            {
                var negocio = new Negocio.Mensagens();
                var idiomas = new Negocio.Idiomas();

                string sigla = StringUtil.RetornaTextoAleatorio(5);

                var idiomaPt = idiomas.ObterPorSigla("pt-br");
                
                Entidades.Idioma idioma = new Entidades.Idioma { Sigla = sigla, Descricao = StringUtil.RetornaTextoAleatorio(10) };
                idiomas.Inserir(idioma);

                Entidades.Mensagem mensagem1 = new Entidades.Mensagem
                {
                    Idioma = idioma,
                    TextoMensagem = StringUtil.RetornaTextoAleatorio(2000),
                    Proposito = StringUtil.RetornaTextoAleatorio(2000)
                };

                Entidades.Mensagem mensagem2 = new Entidades.Mensagem
                {
                    Idioma = idioma,
                    TextoMensagem = StringUtil.RetornaTextoAleatorio(2000),
                    Proposito = StringUtil.RetornaTextoAleatorio(2000)
                };
                negocio.Inserir(mensagem1);
                negocio.Inserir(mensagem2);

                var mensagens = negocio.ListaMensagensPorIdioma(sigla);
                ok = (mensagens.Count == 2);

            }
            catch (ArgumentNullException)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }
        #endregion [ Listar ]

    }
}
